menu: Realize window before positioning
authorBenjamin Otte <otte@redhat.com>
Wed, 25 May 2011 02:48:20 +0000 (04:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 25 May 2011 02:48:20 +0000 (04:48 +0200)
We want the menu realized so we know the size it's allocating to itself.
And we need that size to position the menu properly.
This is best visible on right-to-left.

gtk/gtkmenu.c

index b6e4ee8d883431e71ba04c319b5dea1d0259271a..90ae933c77823c8cd846d82847646ae0c4001d6f 100644 (file)
@@ -1695,7 +1695,7 @@ gtk_menu_popup_for_device (GtkMenu             *menu,
 
     gtk_widget_size_allocate (priv->toplevel, &tmp_allocation);
 
-    gtk_widget_realize (GTK_WIDGET (menu));
+    gtk_widget_realize (priv->toplevel);
   }
 
   gtk_menu_scroll_to (menu, priv->scroll_offset);
@@ -4656,10 +4656,12 @@ gtk_menu_position (GtkMenu  *menu,
   pointer = _gtk_menu_shell_get_grab_device (GTK_MENU_SHELL (menu));
   gdk_device_get_position (pointer, &pointer_screen, &x, &y);
 
-  /* Get the minimum height for minimum width to figure out
+  /* Realize so we have the proper width and heigh to figure out
    * the right place to popup the menu.
    */
-  gtk_widget_get_preferred_size (widget, &requisition, NULL);
+  gtk_widget_realize (priv->toplevel);
+  requisition.width = gtk_widget_get_allocated_width (widget);
+  requisition.height = gtk_widget_get_allocated_height (widget);
 
   if (pointer_screen != screen)
     {